package com.tydic.workflow.service;

import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface IBpmService {
    /**
     * 启动流程实例
     *
     * @param processDefinitionKey 流程定义key，不能为空.
     * @param variables            流程实例变量。
     * @return 流程实例
     */
    ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);

    /**
     * 启动流程实例
     *
     * @param processDefinitionKey 流程定义key，不能为空.
     * @param businessKey          业务关键字
     * @param variables            流程实例变量。
     * @return 流程实例
     */
    ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey, Map<String, Object> variables);

    /**
     * 获取当前待办任务
     *
     * @param processInstanceId 流程ID
     * @param userId            用户ID
     * @return 任务
     */
    Task getTask(String processInstanceId, String userId);


    /**
     * 获取当前待办任务
     *
     * @param processInstanceId 流程ID
     * @return 任务
     */
    Task getTask(String processInstanceId);

    /**
     * 获取当前待办任务列表
     *
     * @param userId 用户ID
     * @param offset 偏移量
     * @param limit  限制数量
     * @return 任务列表
     */
    List<Task> getTasks(String userId, int offset, int limit);

    /**
     * 候选人反签收任务
     *
     * @param taskId 任务的id，不能为null.
     */
    void unclaim(String taskId);

    /**
     * 候选人签收任务
     *
     * @param taskId
     * @param userId
     */
    void claim(String taskId, String userId);

    /**
     * 执行任务
     *
     * @param taskId 任务的id，不能为null.
     */
    void complete(String taskId);

    /**
     * 执行任务
     *
     * @param taskId    任务的id，不能为null.
     * @param variables 任务参数
     */
    void complete(String taskId, Map<String, Object> variables);

    /**
     * 执行任务
     *
     * @param taskId    任务的id，不能为null.
     * @param variables 任务参数
     * @param comment   处理意见
     */
    void complete(String taskId, Map<String, Object> variables, String comment);

    /**
     * 任务委派
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 被委派人ID.
     */
    void delegate(String taskId, String userId);

    /**
     * 任务移交：将任务的所有权转移给其他用户。
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 接受所有权的人.
     */
    void setAssignee(String taskId, String userId);

    /**
     * 委派任务完成，归还委派人
     *
     * @param taskId 任务的id，不能为null.
     */
    void resolveTask(String taskId);

    /**
     * 任务撤回
     *
     * @param processInstanceId 流程实例ID.
     * @param currentActivityId 当前活动任务ID.
     * @param newActivityId     撤回到达的任务ID.
     */
    void withdraw(String processInstanceId, String currentActivityId, String newActivityId);

    /**
     * 获取流程任务流转信息
     *
     * @param processInstanceId 流程实例ID
     * @return 历史任务列表
     */
    List<HistoricTaskInstance> getHistoryTasks(String processInstanceId);

    /**
     * 获取流程活动信息
     *
     * @param processInstanceId 流程实例ID
     * @return 历史活动列表
     */
    List<HistoricActivityInstance> getHistoryActivities(String processInstanceId);

    /**
     * 获取流程实例列表
     *
     * @param processInstanceIds 流程实例ID列表
     * @return 流程实例列表
     */
    List<HistoricProcessInstance> getHistoryProcessInstances(Set<String> processInstanceIds);

    /**
     * 获取流程实例
     *
     * @param processInstanceId 流程实例ID
     * @return 流程实例
     */
    HistoricProcessInstance getHistoryProcessInstance(String processInstanceId);

    /**
     * 设置认证用户ID
     *
     * @param userId 用户ID
     */
    void setAuthenticatedUserId(String userId);
}
